#ifndef BYTEARRAY_H
#define BYTEARRAY_H
#include "gus2_typedef.h"
#include <stdarg.h>
typedef struct {
    int size;
    int len;
    union {
        u32 self_ival;
        void* self_args;
    };
    u8* data;
}bytearray_t;
void byte_array_init(bytearray_t* byarray, u8* buff, int size);

#if GUS2_ENABLE_MALLOC_FREE
bytearray_t* byte_array_create(int size);
void byte_array_free(bytearray_t* byarr);
#endif 

int byte_array_push_byte(bytearray_t* byarr, u8 byt);
int byte_array_push_byte_ret_free(bytearray_t* byarr, u8 byt);
int byte_array_push_bytes(bytearray_t* byarr, int count, const u8* byts);
int byte_array_clear(bytearray_t* byarr);
int byte_array_pop(bytearray_t* byarr, int count);
int byte_array_vserial(bytearray_t* byarr, const char* format, va_list ap);
int byte_array_serial(bytearray_t* byarr, const char* format, ...);
int byte_array_serial_pre_cnt(bytearray_t* byarr, const char* format, ...);
int byte_array_vserial_pre_cnt(bytearray_t* byarr, const char* format, va_list ap);
/*
*  format: specify the format
            Data Format:
      b -> byte, B array bytearry_t data type
      w -> u16 little endian, W big endian
      d -> u32 little endian, D big endian
      s -> const char*
      S -> const char with no length*
*/
int byte_array_unvserial(const bytearray_t* ba, int start, const char* format, va_list argp );
int byte_array_unserial(const bytearray_t* ba, int start, const char* format, ...);

int byte_array_preset_cnt(bytearray_t* ba);
void byte_array_segment_init(bytearray_t* ba, bytearray_t* segment, int size);
void byte_array_segment_merge(bytearray_t* ba, bytearray_t* segment);
void utils_exector_cmd_inc(bytearray_t* ba);

#endif


